
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>ES是如何实现分布式搜索和分析的？ - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>ES是如何实现分布式搜索和分析的？ - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">在Elasticsearch的分布式架构中，索引（Index）和分片（Shard）之间是什么关系？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">索引是Elasticsearch中数据的逻辑存储单位，类似于关系型数据库中的数据库。而分片是基本的数据分布单元，一个索引可以被拆分成一个或多个分片，以实现水平扩展。</div>
          </div>
          <div class="card-source">来源: 文档中「1. Elasticsearch 的分布式架构」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Elasticsearch是如何决定一个新文档应该被存储在哪个主分片上的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Elasticsearch使用一种基于哈希算法的机制。当数据到达节点时，它会根据文档的ID计算出一个哈希值，然后通过该哈希值决定数据应该被路由到哪个主分片，从而确保数据在集群中均匀分布。</div>
          </div>
          <div class="card-source">来源: 文档中「2. 数据分布和索引分片」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">副本分片（Replica Shard）在Elasticsearch中主要起到哪两个作用？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">副本分片主要有两个作用：一是提供数据冗余以实现故障恢复，确保数据的可靠性和可用性；二是可以分担读取请求的负载，提高查询性能。</div>
          </div>
          <div class="card-source">来源: 文档中「2. 数据分布和索引分片」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">请简述Elasticsearch分布式搜索的完整流程。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">一个分布式搜索请求的流程包括：1. 请求路由到协调节点；2. 协调节点将请求转发至相关分片进行查询（查询阶段）；3. 协调节点收集并合并所有分片返回的本地结果集（结果合并阶段）；4. 如果有聚合操作，则进行二次聚合（聚合阶段）；5. 协调节点将最终结果返回给用户（结果返回）。</div>
          </div>
          <div class="card-source">来源: 文档中「3. 分布式搜索的实现」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">Elasticsearch的分布式分析通常采用什么计算方式？请简述其两个主要阶段。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">分布式分析通常采用MapReduce的方式进行。第一阶段（Map阶段），每个分片会独立计算部分聚合结果。第二阶段（Reduce阶段），协调节点会对所有分片的部分结果进行全局聚合，得到最终的分析结果。</div>
          </div>
          <div class="card-source">来源: 文档中「4. 分布式分析的实现」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当Elasticsearch集群中的一个节点宕机时，系统会如何自动应对以保证高可用性？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当某个节点宕机时，Elasticsearch会进行自动故障转移。它会自动检测到故障，并将该节点上的分片重新分配到其他健康的节点上。同时，主分片和副本分片的设计确保了在任一节点故障时，可以将主分片的角色快速转移到副本分片上。</div>
          </div>
          <div class="card-source">来源: 文档中「5. 高可用性与容错机制」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Elasticsearch中的节点（Node）可以有哪些不同的角色？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">节点的角色可以是主节点（Master Node）、数据节点（Data Node）、协调节点（Coordinating Node）等，不同的节点负责不同的功能。</div>
          </div>
          <div class="card-source">来源: 文档中「1. Elasticsearch 的分布式架构」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Elasticsearch如何处理写请求和读请求？这种机制导致了哪种数据一致性模型？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">所有写请求首先路由到主分片，成功后异步复制到副本分片。读请求可以由主分片或副本分片处理。由于副本分片的更新是异步的，读取时可能会返回稍微过时的数据，这实现了“最终一致性”模型。</div>
          </div>
          <div class="card-source">来源: 文档中「6. 数据一致性和最终一致性」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在分布式搜索中，协调节点（Coordinating Node）在“结果合并”阶段的具体任务是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在“结果合并”阶段，协调节点收集所有分片返回的本地结果集（通常包含文档ID和相关性得分），然后对这些结果集进行合并和重新排序，以得到全局的前N个最相关的结果。</div>
          </div>
          <div class="card-source">来源: 文档中「3. 分布式搜索的实现」部分</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
